home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAEGetData.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  14.1 KB  |  506 lines  |  [TEXT/CWIE]

  1. // SVAEGetData.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEGetData.h"
  8.  
  9. #include "SVEditWindow.h"
  10. #include "SVEditGlobals.h"
  11. #include "SVEditAEUtils.h"
  12. #include "SVAppleEvents.h"
  13.  
  14. #include "SVAETextUtils.h"
  15. #include "SVAEWindowUtils.h"
  16. #include "SVAEAccessors.h"
  17. #include "SVAERecording.h"
  18. #include "SVToken.h"
  19.  
  20.  
  21. #include <AEPackObject.h>
  22. #include <Resources.h>
  23.  
  24.  
  25.  
  26. extern short        gRefNum;
  27.  
  28. // -----------------------------------------------------------------------
  29. //        Name:             DoGetData
  30. //        Purpose:        Handles the GetData AppleEvent.
  31. // -----------------------------------------------------------------------
  32.  
  33. pascal OSErr     DoGetData(const AppleEvent    *theAppleEvent,
  34.                                 AppleEvent    *reply,
  35.                                 long        handlerRefCon)
  36. #pragma unused (handlerRefCon)
  37.  
  38.     AEDesc        directObj = {typeNull, NULL},
  39.                 result = {typeNull, NULL};
  40.     Size        actualSize;
  41.     DescType    returnedType;
  42.     DescType    reqType;
  43.     OSErr        reqTypeErr,
  44.                 err;
  45.     
  46.         // extract the direct object, which is the object
  47.         // whose data is to be returned
  48.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  49.     if (noErr != err) goto done;
  50.         
  51.         // now the get the type of data wanted - optional
  52.     reqTypeErr = AEGetParamPtr(theAppleEvent, keyAERequestedType, typeType,
  53.                                 &returnedType, (Ptr)&reqType, sizeof(reqType), &actualSize);
  54.         
  55.     err = GotRequiredParams(theAppleEvent);
  56.     if (noErr != err) goto done;
  57.     
  58.         // get the data
  59.     err = HandleGetData(&directObj, &result);
  60.         
  61.     err = AddResultToReply(&result, reply, err);
  62.  
  63. done:                
  64.     if (directObj.dataHandle)
  65.           AEDisposeDesc(&directObj);
  66.     if (result.dataHandle)
  67.           AEDisposeDesc(&result);
  68.         
  69.     return(err);
  70. }    // DoGetData
  71.  
  72.  
  73. // -----------------------------------------------------------------------
  74. //    Name:         HandleGetData
  75. //    Purpose:    Coerces theObj into a token which we understand and
  76. //                extracts the data requested in the token and puts it
  77. //                into dataDesc.
  78. // -----------------------------------------------------------------------
  79.  
  80. OSErr    HandleGetData(AEDesc *theObj, AEDesc *dataDesc)
  81. {
  82.     TextToken       theTextToken;
  83.     Size            tokenSize;
  84.     AEDesc          objTokenDesc = {typeNull, NULL},
  85.                     itemDesc = {typeNull, NULL},
  86.                     resultDesc = {typeNull, NULL};
  87.     long            index;
  88.     DescType        returnedType;
  89.     OSErr           err;
  90.  
  91.             //    Coerce theObj into a token which we can use - 
  92.             //        this may involve converting a list of tokens to a list of property tokens
  93.     if (typeObjectSpecifier == theObj->descriptorType)
  94.         err = AEResolve(theObj, kAEIDoMinimum, &objTokenDesc);
  95.     else    // Otherwise, just copy it
  96.         err = AEDuplicateDesc(theObj, &objTokenDesc);
  97.     
  98.     if (noErr != err) goto done;
  99.     
  100.     switch (objTokenDesc.descriptorType)
  101.     {
  102.         case typeMyApplProp:
  103.             err = GetApplicationProperty(&objTokenDesc, dataDesc);
  104.             break;
  105.             
  106.         case typeMyTextProp:
  107.             err = GetTextProperty(&objTokenDesc, dataDesc);
  108.             break;
  109.             
  110.         case typeMyWindowProp:
  111.             err = GetWindowProperty(&objTokenDesc, dataDesc);
  112.             break;
  113.             
  114.         case typeMyText:
  115.             GetRawDataFromDescriptor(&objTokenDesc, (Ptr)&theTextToken,
  116.                                         sizeof(theTextToken), &tokenSize);
  117.             
  118.             err = GetTextTextProperty(&theTextToken, dataDesc);
  119.             break;
  120.             
  121.         case typeAEList:
  122.             err = AECountItems(&objTokenDesc, &index);
  123.             if (noErr != err) goto done;
  124.     
  125.             for (; index > 0; index--)
  126.             {
  127.                 err = AEGetNthDesc(&objTokenDesc, index, typeWildCard, &returnedType, &itemDesc);
  128.     
  129.                 if (noErr == err)        // Call this function recursively if necessary
  130.                     err = HandleGetData(&itemDesc, &resultDesc);
  131.                 
  132.                 if (noErr == err)        // Overwrite item in list with descriptor item
  133.                     err = AEPutDesc(&objTokenDesc, index, &resultDesc);
  134.                                                         // objTokenDesc is just a copy anyway.
  135.                 if (itemDesc.dataHandle)
  136.                     AEDisposeDesc(&itemDesc);
  137.                 if (resultDesc.dataHandle)
  138.                     AEDisposeDesc(&resultDesc);
  139.             }
  140.             
  141.             err = AEDuplicateDesc(&objTokenDesc, dataDesc);        // Copy list into result
  142.             break;
  143.             
  144.         default:    
  145.             err = errAEWrongDataType;
  146.     }
  147.  
  148. done:
  149.     if (objTokenDesc.dataHandle)
  150.         AEDisposeDesc(&objTokenDesc);
  151.     
  152.     return(err);
  153. } // HandleGetData
  154.  
  155.  
  156. // Get the actual data for a text token - rather than just offset and length
  157. // used internally.
  158.  
  159. OSErr    GetTextTextProperty(TextToken* theToken, AEDesc *dataDesc)
  160. {
  161.     TEHandle    aTEH;
  162.     short        anOffset,
  163.                 aLength;
  164.     OSErr        err;
  165.     
  166.     aTEH = TEHandleFromTextToken(theToken);
  167.     anOffset = theToken->tokenOffset;
  168.     aLength = theToken->tokenLength;
  169.     
  170.     err = BuildStyledTextDesc(aTEH, anOffset, aLength, dataDesc);
  171.  
  172.     return(err);
  173. }
  174.  
  175. // -----------------------------------------------------------------------
  176. //    Name:         GetTextProperty
  177. //    Purpose:    Fills dataDesc with the requested text property.
  178. // -----------------------------------------------------------------------
  179.      
  180. OSErr GetTextProperty(const AEDesc *theTokenDesc, AEDesc *dataDesc)
  181. {
  182.     DPtr          theDocument;
  183.     TEHandle      theHTE;
  184.     Str255        fontName;
  185.     TextStyle     theTextStyle;
  186.     short         lineHeight;
  187.     short         fontAscent;
  188.     TextPropToken theTextPropToken;
  189.     Size          tokenSize;
  190.     AEDesc        tempDesc;
  191.     OSErr         err;
  192.     
  193.     err = AECoerceDesc(theTokenDesc, typeMyTextProp, &tempDesc);
  194.     if (noErr != err) goto done;
  195.     
  196.     GetRawDataFromDescriptor(&tempDesc, (Ptr)&theTextPropToken,
  197.                                     sizeof(theTextPropToken), &tokenSize);
  198.  
  199.     // For each property we build a descriptor to be returned as the reply.
  200.             
  201.     theDocument = DPtrFromWindowPtr(theTextPropToken.tokenTextToken.tokenWindow);
  202.     theHTE = theDocument->theText;
  203.     
  204.     TEGetStyle(theTextPropToken.tokenTextToken.tokenOffset - 1, &theTextStyle,
  205.                                                 &lineHeight, &fontAscent, theHTE);
  206.     
  207.     switch (theTextPropToken.tokenProperty)
  208.     {
  209.         case pText:
  210.         case pContents:
  211.             err = GetTextTextProperty(&(theTextPropToken.tokenTextToken), dataDesc);
  212.             break;
  213.             
  214.         case pFont: 
  215.             GetFontName(theTextStyle.tsFont, fontName);
  216.             
  217.             err = AECreateDesc(typeChar,  (Ptr)&fontName[1], fontName[0], dataDesc);
  218.             break;
  219.         
  220.         case pTextStyles: 
  221.             err = BuildTextStylesDesc(theTextStyle.tsFace, dataDesc);
  222.             break;
  223.  
  224.         case pPointSize: 
  225.             err = CreateOffsetDescriptor(theTextStyle.tsSize, dataDesc);
  226.             break;
  227.  
  228.         case pScriptTag: 
  229.             err = CreateOffsetDescriptor(smSystemScript, dataDesc);
  230.             break;
  231.         
  232.         case pColor: 
  233.             err = AECreateDesc(typeRGBColor, (Ptr)&theTextStyle.tsColor,
  234.                                         sizeof(theTextStyle.tsColor), dataDesc);
  235.             break;
  236.             
  237.         case pLength:
  238.             tokenSize = theTextPropToken.tokenTextToken.tokenLength;
  239.             err = AECreateDesc(typeInteger, (Ptr)&tokenSize,
  240.                                 sizeof(tokenSize), dataDesc);
  241.             break;
  242.             
  243.         case pOffset:
  244.             tokenSize = theTextPropToken.tokenTextToken.tokenOffset;
  245.             err = AECreateDesc(typeInteger, (Ptr)&tokenSize,
  246.                                 sizeof(tokenSize), dataDesc);
  247.             break;
  248.             
  249.         default:
  250.             err = errAEEventNotHandled;
  251.     }
  252.  
  253. done:
  254.     if (tempDesc.dataHandle)
  255.         AEDisposeDesc(&tempDesc);
  256.     
  257.     return(err);
  258. } // GetTextProperty
  259.     
  260. // -----------------------------------------------------------------------
  261. //        Name:             GetWindowProperty
  262. //        Purpose:        Fills dataDesc with the requested window property.
  263. // -----------------------------------------------------------------------
  264. typedef Rect **RectHandle;
  265.  
  266. OSErr    GetWindowProperty(const AEDesc *theWPTokenObj, AEDesc *dataDesc)
  267. {             
  268.     Str255          theName;
  269.     Boolean         theBoolean;
  270.     Rect            theRect;
  271.     Point           thePoint;
  272.     Rect            winRect;
  273.     Rect            userRect;
  274.     short           theIndex;
  275.     DPtr            docPtr;
  276.     TEHandle        theHTE;
  277.     GrafPtr         savePort;
  278.     WindowPropToken theWindowPropToken;
  279.     AEDesc          tempDesc = {typeNull, NULL};
  280.     Size            tokenSize;
  281.     Handle          thePGXHandle;
  282.     OSErr           err;
  283.     
  284.     err = AECoerceDesc(theWPTokenObj,typeMyWindowProp, &tempDesc);
  285.     if (noErr != err) goto done;
  286.     
  287.     GetRawDataFromDescriptor(&tempDesc, (Ptr)&theWindowPropToken,
  288.                                 sizeof(theWindowPropToken),  &tokenSize);
  289.     
  290.     switch (theWindowPropToken.tokenProperty)
  291.     {
  292.         case pName:
  293.             GetWTitle(theWindowPropToken.tokenWindowToken.tokenWindow, theName);
  294.             err = AECreateDesc(typeChar, (Ptr)&theName[1], theName[0], dataDesc);
  295.             break;
  296.             
  297.         case pText:
  298.         case pContents:
  299.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  300.             theHTE = docPtr->theText;
  301.             err = BuildStyledTextDesc(theHTE, 1, (**theHTE).teLength, dataDesc);
  302.             break;
  303.             
  304.         case pBounds:
  305.             GetPort(&savePort);
  306.             SetPort(theWindowPropToken.tokenWindowToken.tokenWindow);
  307.             theRect = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox;
  308.             err = AECreateDesc(typeQDRectangle, (Ptr)&theRect, sizeof(theRect), dataDesc);
  309.             SetPort(savePort);
  310.             break;
  311.             
  312.         case pPosition:
  313.             thePoint.v = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox.top;
  314.             thePoint.h = (*((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->strucRgn)->rgnBBox.left;
  315.             err= AECreateDesc(typeQDPoint, (Ptr)&thePoint, sizeof(thePoint), dataDesc);
  316.             break;
  317.             
  318.         case pVisible:
  319.             theBoolean = ((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->visible;
  320.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  321.             break;
  322.             
  323.         case pIsModal:
  324.         case pIsFloating:
  325.             theBoolean = false;
  326.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  327.             break;
  328.             
  329.         case pIsZoomed:
  330.             if (((WindowPeek)theWindowPropToken.tokenWindowToken.tokenWindow)->spareFlag)
  331.             {
  332.                 GetPort(&savePort);
  333.                 SetPort(theWindowPropToken.tokenWindowToken.tokenWindow);
  334.                 
  335.                 userRect = **((RectHandle)((WindowPeek)qd.thePort)->dataHandle);
  336.                 winRect  = qd.thePort->portRect;
  337.                 LocalToGlobal((Point *)&winRect.top);
  338.                 LocalToGlobal((Point *)&winRect.bottom);
  339.                 
  340.                 theBoolean = ! EqualRect(&userRect, &winRect);
  341.                 SetPort(savePort);
  342.             }
  343.             else
  344.                 theBoolean = false;
  345.                             
  346.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  347.             break;
  348.             
  349.         case pIsResizable:
  350.         case pHasTitleBar:
  351.         case pHasCloseBox:
  352.         case pIsZoomable:
  353.             theBoolean = true;
  354.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  355.             break;
  356.             
  357.         case pIsModified:
  358.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  359.             theBoolean = docPtr->dirty;
  360.             err = AECreateDesc(typeBoolean, (Ptr)&theBoolean, sizeof(theBoolean), dataDesc);
  361.             break;
  362.             
  363.         case pIndex:
  364.             theIndex = 0;
  365.             if (theWindowPropToken.tokenWindowToken.tokenWindow) 
  366.                 do
  367.                     theIndex++;
  368.                 while (theWindowPropToken.tokenWindowToken.tokenWindow != GetWindowPtrOfNthWindow(theIndex));
  369.                             
  370.             err = AECreateDesc(typeShortInteger, (Ptr)theIndex, sizeof(theIndex), dataDesc);
  371.             break;
  372.             
  373.         case pPageSetup:
  374.             if (! gGXIsPresent)
  375.             {
  376.                 docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  377.                 
  378.                 HLock((Handle)docPtr->thePrintSetup);
  379.                 err = AECreateDesc(typeTPrint, (Ptr)*(docPtr->thePrintSetup),
  380.                                                                 sizeof(TPrint), dataDesc);
  381.                 HUnlock((Handle)docPtr->thePrintSetup);
  382.             }
  383.             else
  384.                 err = errAEEventNotHandled;                         
  385.             break;
  386.  
  387.         case pGXPageSetup:
  388.             if (gGXIsPresent)
  389.             {
  390.                 docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  391.     
  392.                 thePGXHandle = NewHandle(0);
  393.                 GXFlattenJobToHdl(docPtr->documentJob, thePGXHandle);
  394.     
  395.                 HLock(thePGXHandle);
  396.                 
  397.                 err = AECreateDesc(typeTPrint, *thePGXHandle,
  398.                                         GetHandleSize(thePGXHandle), dataDesc);
  399.                                                              
  400.                 HUnlock(thePGXHandle);                                                                             
  401.                 DisposeHandle( thePGXHandle );
  402.             }
  403.             else
  404.                 err = errAEEventNotHandled;                     
  405.             break;
  406.             
  407.         case pSelection:
  408.             docPtr = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken.tokenWindow);
  409.             err = MakeSelectedTextObj(theWindowPropToken.tokenWindowToken.tokenWindow,
  410.                                                                  docPtr->theText, dataDesc);
  411.             break;
  412.     
  413.         default:
  414.             err = errAEEventNotHandled;
  415.     }
  416.  
  417. done:
  418.     if (tempDesc.dataHandle)
  419.         AEDisposeDesc(&tempDesc);
  420.             
  421.     return(err);
  422. } // GetWindowProperty
  423.     
  424. // -----------------------------------------------------------------------
  425. //        Name:             GetApplicationProperty
  426. //        Purpose:        Fills dataDesc with the requested application property.
  427. // -----------------------------------------------------------------------
  428.      
  429. OSErr    GetApplicationProperty(const AEDesc *theObjToken, AEDesc *result)
  430. {
  431.     Str255                name;
  432.     Boolean                isFront;
  433.     ApplPropToken        theApplPropToken;
  434.     AEDesc                aDesc = {typeNull, NULL},
  435.                         nullDesc = {typeNull, NULL};
  436.     Size                tokenSize;
  437.     DescType            theType;
  438.     ProcessInfoRec        processInfo;
  439.     ProcessSerialNumber    currentProcess;
  440.       short                refNum;
  441.     Handle                aHandle;
  442.       OSErr                err;
  443.     
  444.     err = AECoerceDesc(theObjToken, typeMyApplProp, &aDesc);
  445.     if (noErr != err) goto done;
  446.     
  447.     GetRawDataFromDescriptor(&aDesc, (Ptr)&theApplPropToken,
  448.                                         sizeof(theApplPropToken), &tokenSize);
  449.       
  450.     switch (theApplPropToken.tokenApplProperty)
  451.     {
  452.         case pBestType:      // Return the null descriptor representing
  453.         case pDefaultType:    // the application.
  454.             err = AEDuplicateDesc(&nullDesc, result);
  455.             break;
  456.         
  457.         case pClass:
  458.             theType = cApplication;
  459.             err = AECreateDesc(typeType, (Ptr)&theType, sizeof(DescType), result);
  460.             break;
  461.         
  462.         case pName:
  463.             // Clear out the name, and then call the process manager to get
  464.             // the string for the name of our application.
  465.             
  466.             name[0] = 0;
  467.             processInfo.processInfoLength = sizeof(processInfo);
  468.             processInfo.processName = name;
  469.             processInfo.processAppSpec = NULL;
  470.             
  471.             GetCurrentProcess(¤tProcess);
  472.             GetProcessInformation(¤tProcess, &processInfo);
  473.             
  474.             // Create an AEDesc returning the application name string
  475.             // returned by the process manager.
  476.  
  477.             err = AECreateDesc(typeChar, (Ptr)&name[1], name[0], result);
  478.             break;
  479.         
  480.         case pIsFrontProcess:
  481.             isFront = ! gInBackground;
  482.             err = AECreateDesc(typeBoolean, (Ptr)&isFront, sizeof(isFront), result);
  483.             break;
  484.  
  485.         case pVersion:
  486.             refNum = CurResFile();    // save current resource
  487.             UseResFile(gRefNum);    // set this resource to be current
  488.             aHandle = (Handle)Get1Resource((ResType)'vers', 1);
  489.             HLock(aHandle);
  490.             err = AECreateDesc(typeVersion, *aHandle, GetHandleSize(aHandle), result);
  491.             HUnlock(aHandle);
  492.             UseResFile(refNum);     // reset back to resource previously set
  493.             break;
  494.  
  495.         default:   // We don't handle the requested property.
  496.             err = errAEEventNotHandled;
  497.     }
  498.  
  499. done:
  500.     if (aDesc.dataHandle)
  501.         AEDisposeDesc(&aDesc);
  502.             
  503.     return(err);
  504. } // GetApplicationProperty
  505.